WebCodecsμ λΉλμ€ νλ μ μ κ³΅κ° λ³ν κΈ°λ₯κ³Ό νλ μ νμ λ³νμ μ΄ν΄λ³΄μΈμ. μ΄ κ°λ ₯ν μΉ APIμ μ€μ μ μ© λ° κΈ°μ μ λμμ€λ₯Ό μμλ΄ λλ€.
WebCodecs VideoFrame μ κ³΅κ° λ³ν: νλ μ νμ λ³ν μ¬μΈ΅ λΆμ
μΉ κΈ°λ° λΉλμ€ μ²λ¦¬ μμμμ λΉλμ€ νλ μμ ν¨μ¨μ μ΄κ³ ν¨κ³Όμ μΌλ‘ μ‘°μνλ λ₯λ ₯μ λ§€μ° μ€μν©λλ€. WebCodecs APIλ λΈλΌμ°μ λ΄μμ μ§μ λ―Έλμ΄ μ€νΈλ¦Όμ μ²λ¦¬ν μ μλ κ°λ ₯νκ³ μ μ°ν μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€. μ΄μ κΈ°λ³Έμ μΈ‘λ©΄μ VideoFrame κ°μ²΄μ λν μ κ³΅κ° λ³ν λ° νλ μ νμ λ³νμ μννλ κΈ°λ₯μ
λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμμλ μ΄ κΈ°λ₯μ κΈ°μ μ μΈλΆ μ¬νκ³Ό μ€μ μ μ©μ μμΈν μ΄ν΄λ³΄κ³ λ€μν μ 곡κ°κ³Ό νλ μ νμ κ°μ λ³ν 볡μ‘μ±μ νꡬν©λλ€.
μ κ³΅κ° λ° νλ μ νμ μ΄ν΄
WebCodecsμ ꡬ체μ μΈ λ΄μ©μ μ΄ν΄λ³΄κΈ° μ μ μ κ³΅κ° λ° νλ μ νμμ κΈ°λ³Έ κ°λ μ νμ νλ κ²μ΄ νμμ μ λλ€. μ΄λ¬ν κ°λ μ λΉλμ€ λ°μ΄ν°κ° μ΄λ»κ² ννλκ³ μ΄λ»κ² μ‘°μλ μ μλμ§ μ΄ν΄νλ λ° κΈ°λ³Έμ΄ λ©λλ€.
μ 곡κ°
μ 곡κ°μ μ΄λ―Έμ§ λλ λΉλμ€μ μμμ΄ μμΉμ μΌλ‘ ννλλ λ°©μμ μ μν©λλ€. λ€μν μ 곡κ°μ νμν μ μλ μμ λ²μλ₯Ό μ€λͺ νκΈ° μν΄ λ€μν λͺ¨λΈμ μ¬μ©ν©λλ€. λͺ κ°μ§ μΌλ°μ μΈ μ 곡κ°μ λ€μκ³Ό κ°μ΅λλ€.
- RGB (λΉ¨κ°, λ Ήμ, νλ): νΉν μ»΄ν¨ν° λμ€νλ μ΄μ λ리 μ¬μ©λλ μ 곡κ°μ λλ€. κ° μμμ λΉ¨κ°, λ Ήμ, νλ κ΅¬μ± μμλ‘ ννλ©λλ€.
- YUV (λ° YCbCr): ν¨μ¨μ±μΌλ‘ μΈν΄ μ£Όλ‘ λΉλμ€ μΈμ½λ© λ° μ μ‘μ μ¬μ©λ©λλ€. Yλ 루λ§(λ°κΈ°) κ΅¬μ± μμλ₯Ό λνλ΄κ³ U λ° V(λλ Cb λ° Cr)λ ν¬λ‘λ―Έλμ€(μμ) κ΅¬μ± μμλ₯Ό λνλ λλ€. μ΄ λΆλ¦¬λ₯Ό ν΅ν΄ ν¨μ¨μ μΈ μμΆ κΈ°μ μ΄ κ°λ₯ν©λλ€. μΌλ°μ μΈ YUV νμμλ ν¬λ‘λ§ μλΈμνλ§μ΄ λ€λ₯Έ YUV420p, YUV422p λ° YUV444pκ° ν¬ν¨λ©λλ€.
- HDR (High Dynamic Range): λ λμ λ²μμ νλ κ°μ μ 곡νμ¬ λ³΄λ€ νμ€μ μ΄κ³ μμΈν μμμ μ 곡ν©λλ€. HDR μ½ν μΈ λ HDR10, Dolby Vision λ° HLGμ κ°μ λ€μν νμμΌλ‘ μΈμ½λ©ν μ μμ΅λλ€.
- SDR (Standard Dynamic Range): νμ€ λΉλμ€ λ° λμ€νλ μ΄μ μ¬μ©λλ κΈ°μ‘΄ λ€μ΄λ΄λ―Ή λ μΈμ§μ λλ€.
νλ μ νμ
νλ μ νμμ λΉλμ€μ κ° νλ μ λ΄μμ μμ λ°μ΄ν°κ° λ°°μ΄λλ λ°©μμ μ€λͺ ν©λλ€. μ¬κΈ°μλ λ€μκ³Ό κ°μ μΈ‘λ©΄μ΄ ν¬ν¨λ©λλ€.
- ν½μ νμ: μ΄λ μμ κ΅¬μ± μμκ° ννλλ λ°©μμ μ§μ ν©λλ€. μλ₯Ό λ€μ΄ RGB888(κ° λΉ¨κ°, λ Ήμ, νλ κ΅¬μ± μμμ λν 8λΉνΈ) λ° YUV420p(μμμ μΈκΈν λ°μ κ°μ΄)κ° μμ΅λλ€.
- λλΉ λ° λμ΄: λΉλμ€ νλ μμ ν¬κΈ°μ λλ€.
- μ€νΈλΌμ΄λ: ν½μ μ ν νμ μμκ³Ό λ€μ νμ μμ μ¬μ΄μ λ°μ΄νΈ μμ λλ€. μ΄λ λ©λͺ¨λ¦¬ λ μ΄μμ λ° ν¨μ¨μ μΈ μ²λ¦¬μ μ€μν©λλ€.
μ κ³΅κ° λ° νλ μ νμμ μ νμ λΉλμ€ μ½ν μΈ μ νμ§, νμΌ ν¬κΈ° λ° νΈνμ±μ μν₯μ λ―ΈμΉ©λλ€. λ€μν νμ κ°μ λ³νμ ν΅ν΄ λ€μν λμ€νλ μ΄, μΈμ½λ© νμ€ λ° μ²λ¦¬ νμ΄νλΌμΈμ λ§κ² λΉλμ€λ₯Ό μ‘°μ ν μ μμ΅λλ€.
WebCodecs λ° VideoFrame API
WebCodecsλ λΈλΌμ°μ μμ λ―Έλμ΄ λ°μ΄ν°μ μ‘μΈμ€νκ³ μ‘°μνκΈ° μν νμ μμ€ APIλ₯Ό μ 곡ν©λλ€. VideoFrame μΈν°νμ΄μ€λ λ¨μΌ λΉλμ€ λ°μ΄ν° νλ μμ λνλ
λλ€. λ§€μ° ν¨μ¨μ μΌλ‘ μ€κ³λμμΌλ©° κΈ°λ³Έ ν½μ
λ°μ΄ν°μ λν μ§μ μ‘μΈμ€λ₯Ό νμ©ν©λλ€.
μ κ³΅κ° λ³νκ³Ό κ΄λ ¨λ VideoFrame APIμ μ£Όμ μΈ‘λ©΄μ λ€μκ³Ό κ°μ΅λλ€.
- μμ±μ: μμ ν½μ
λ°μ΄ν° λ°
ImageBitmapκ°μ²΄λ₯Ό ν¬ν¨ν λ€μν μμ€μμVideoFrameκ°μ²΄λ₯Ό λ§λ€ μ μμ΅λλ€. colorSpaceμμ±: νλ μμ μ 곡κ°(μ: 'srgb', 'rec709', 'hdr10', 'prophoto')μ μ§μ ν©λλ€.formatμμ±: ν½μ νμ λ° ν¬κΈ°λ₯Ό ν¬ν¨νμ¬ νλ μμ νμμ μ μν©λλ€. μ΄ μμ±μ μ½κΈ° μ μ©μ λλ€.codedWidthλ°codedHeight: μ½λ© νλ‘μΈμ€μ μ¬μ©λλ ν¬κΈ°μ΄λ©°widthλ°heightμ λ€λ₯Ό μ μμ΅λλ€.- ν½μ
λ°μ΄ν°μ λν μ‘μΈμ€: WebCodecsλ
VideoFrameμΈν°νμ΄μ€ μ체 λ΄μμ μ κ³΅κ° λ³νμ μν ν¨μλ₯Ό μ§μ λ ΈμΆνμ§ μμ§λ§VideoFrameμ Canvas API λ° WebAssemblyμ κ°μ λ€λ₯Έ μΉ κΈ°μ κ³Ό ν¨κ» μ¬μ©νμ¬ νμ λ³νμ ꡬνν μ μμ΅λλ€.
WebCodecsλ₯Ό μ¬μ©ν μ κ³΅κ° λ³ν κΈ°μ
WebCodecsμλ κΈ°λ³Έμ μΌλ‘ μ κ³΅κ° λ³ν κΈ°λ₯μ΄ μκΈ° λλ¬Έμ κ°λ°μλ VideoFrame κ°μ²΄μ ν¨κ» λ€λ₯Έ μΉ κΈ°μ μ νμ©ν΄μΌ ν©λλ€. μΌλ°μ μΈ μ κ·Ό λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
Canvas API μ¬μ©
Canvas APIλ ν½μ
λ°μ΄ν°μ μ‘μΈμ€νκ³ μ‘°μνλ νΈλ¦¬ν λ°©λ²μ μ 곡ν©λλ€. Canvas APIλ₯Ό μ¬μ©νμ¬ VideoFrameμ λ³ννλ μΌλ°μ μΈ μν¬νλ‘λ λ€μκ³Ό κ°μ΅λλ€.
- Canvas μμ λ§λ€κΈ°: HTMLμμ μ¨κ²¨μ§ μΊλ²μ€ μμλ₯Ό λ§λλλ€:
<canvas id="tempCanvas" style="display:none;"></canvas> - Canvasμ VideoFrame 그리기: Canvas 2D λ λλ§ μ»¨ν
μ€νΈμ
drawImage()λ©μλλ₯Ό μ¬μ©ν©λλ€. κ·Έλ¦¬κΈ°κ° μλ£λ ν λ°μ΄ν°λ₯Ό κ°μ Έμ€λ €λ©΄getImageData()λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. - ν½μ
λ°μ΄ν° μΆμΆ: μΊλ²μ€ 컨ν
μ€νΈμμ
getImageData()λ₯Ό μ¬μ©νμ¬ ν½μ λ°μ΄ν°λ₯ΌImageDataκ°μ²΄λ‘ κ²μν©λλ€. μ΄ κ°μ²΄λ λ°°μ΄(RGBA νμ)μμ ν½μ κ°μ λν μ‘μΈμ€λ₯Ό μ 곡ν©λλ€. - μ κ³΅κ° λ³ν μν: ν½μ λ°μ΄ν°λ₯Ό λ°λ³΅νκ³ μ μ ν μ κ³΅κ° λ³ν 곡μμ μ μ©ν©λλ€. μ¬κΈ°μλ μμ€ μ 곡κ°μμ μνλ μ 곡κ°μΌλ‘ μμ κ°μ λ³ννλ μνμ κ³μ°μ΄ ν¬ν¨λ©λλ€. Color.js λλ λ€μν λ³ν νλ ¬κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬κ° μ΄ λ¨κ³λ₯Ό μ§μν μ μμ΅λλ€.
- ν½μ
λ°μ΄ν°λ₯Ό μΊλ²μ€λ‘ λ€μ λ£κΈ°: λ³νλ ν½μ
λ°μ΄ν°λ‘ μ
ImageDataκ°μ²΄λ₯Ό λ§λ€κ³putImageData()λ₯Ό μ¬μ©νμ¬ μΊλ²μ€λ₯Ό μ λ°μ΄νΈν©λλ€. - μ VideoFrame λ§λ€κΈ°: λ§μ§λ§μΌλ‘ Canvas μ½ν
μΈ λ₯Ό μ
VideoFrameμ μμ€λ‘ μ¬μ©ν©λλ€.
μ: RGBμμ νμμ‘°λ‘ λ³ν(λ¨μνλ¨)
async function convertToGrayscale(videoFrame) {
const canvas = document.createElement('canvas');
canvas.width = videoFrame.width;
canvas.height = videoFrame.height;
const ctx = canvas.getContext('2d');
if (!ctx) {
console.error('Could not get 2D context');
return null;
}
ctx.drawImage(videoFrame, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
for (let i = 0; i < data.length; i += 4) {
const r = data[i];
const g = data[i + 1];
const b = data[i + 2];
const grayscale = (r * 0.299) + (g * 0.587) + (b * 0.114);
data[i] = grayscale;
data[i + 1] = grayscale;
data[i + 2] = grayscale;
}
ctx.putImageData(imageData, 0, 0);
// Important: Create a new VideoFrame using the canvas context
const newVideoFrame = new VideoFrame(canvas, {
timestamp: videoFrame.timestamp, // Preserve original timestamp
alpha: 'discard', // or 'keep' depending on requirements
});
videoFrame.close(); //Close the original VideoFrame after creating a new one
return newVideoFrame;
}
μ°Έκ³ : μ΄ νμμ‘° λ³νμ λ§€μ° κ°λ¨ν μμ
λλ€. μ€μ μ κ³΅κ° λ³νμλ 볡μ‘ν κ³μ°μ΄ ν¬ν¨λλ©° λ€μν μ 곡κ°(YUV, HDR λ±)μ μ²λ¦¬νλ €λ©΄ μ μ© λΌμ΄λΈλ¬λ¦¬κ° νμν μ μμ΅λλ€. λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ €λ©΄ close()λ₯Ό νΈμΆνμ¬ VideoFrame κ°μ²΄μ μλͺ
μ£ΌκΈ°λ₯Ό μ μ νκ² κ΄λ¦¬ν΄μΌ ν©λλ€.
WebAssembly μ¬μ©
μ±λ₯μ΄ μ€μν μ ν리μΌμ΄μ μ κ²½μ° WebAssemblyλ μλΉν μ΄μ μ μ 곡ν©λλ€. C++μ κ°μ μΈμ΄λ‘ κ³ λλ‘ μ΅μ νλ μ κ³΅κ° λ³ν 루ν΄μ μμ±νκ³ μ΄λ₯Ό WebAssembly λͺ¨λλ‘ μ»΄νμΌν μ μμ΅λλ€. κ·Έλ° λ€μ μ΄λ¬ν λͺ¨λμ λΈλΌμ°μ μμ μ€ννμ¬ νμ μμ€ λ©λͺ¨λ¦¬ μ‘μΈμ€ λ° κ³μ° ν¨μ¨μ±μ νμ©ν μ μμ΅λλ€. μΌλ°μ μΈ νλ‘μΈμ€λ λ€μκ³Ό κ°μ΅λλ€.
- C/C++ μ½λ μμ±: C/C++λ‘ μ κ³΅κ° λ³ν ν¨μλ₯Ό μμ±ν©λλ€. μ΄ μ½λλ μμ€ ν½μ λ°μ΄ν°(μ: RGB λλ YUV)λ₯Ό κ°μ Έμ λμ μ 곡κ°μΌλ‘ λ³νν©λλ€. λ©λͺ¨λ¦¬λ₯Ό μ§μ κ΄λ¦¬ν΄μΌ ν©λλ€.
- WebAssemblyλ‘ μ»΄νμΌ: WebAssembly μ»΄νμΌλ¬(μ: Emscripten)λ₯Ό μ¬μ©νμ¬ C/C++ μ½λλ₯Ό WebAssembly λͺ¨λ(.wasm νμΌ)λ‘ μ»΄νμΌν©λλ€.
- λͺ¨λ λ‘λ λ° μΈμ€ν΄μ€ν: JavaScript μ½λμμ
WebAssembly.instantiate()ν¨μλ₯Ό μ¬μ©νμ¬ WebAssembly λͺ¨λμ λ‘λν©λλ€. μ΄λ κ² νλ©΄ λͺ¨λμ μΈμ€ν΄μ€κ° μμ±λ©λλ€. - λ³ν ν¨μ μ‘μΈμ€: WebAssembly λͺ¨λμμ λ΄λ³΄λΈ μ κ³΅κ° λ³ν ν¨μμ μ‘μΈμ€ν©λλ€.
- λ°μ΄ν° μ λ¬ λ° μ€ν: μ
λ ₯ ν½μ
λ°μ΄ν°(λ©λͺ¨λ¦¬ 볡μ¬λ₯Ό ν΅ν΄ μ‘μΈμ€ν΄μΌ νλ
VideoFrameμμ)λ₯Ό μ 곡νκ³ WebAssembly ν¨μλ₯Ό νΈμΆν©λλ€. - λ³νλ λ°μ΄ν° κ°μ Έμ€κΈ°: WebAssembly λͺ¨λμ λ©λͺ¨λ¦¬μμ λ³νλ ν½μ λ°μ΄ν°λ₯Ό κ²μν©λλ€.
- μ VideoFrame λ§λ€κΈ°: λ§μ§λ§μΌλ‘ λ³νλ λ°μ΄ν°λ‘ μ
VideoFrameκ°μ²΄λ₯Ό λ§λλλ€.
WebAssemblyμ μ₯μ :
- μ±λ₯: WebAssemblyλ νΉν μ κ³΅κ° λ³νκ³Ό κ°μ κ³μ° μ§μ½μ μΈ μμ μμ JavaScriptλ³΄λ€ ν¨μ¬ λ°μ΄λ μ±λ₯μ λ°νν μ μμ΅λλ€.
- μ΄μμ±: WebAssembly λͺ¨λμ λ€μν νλ«νΌκ³Ό λΈλΌμ°μ μμ μ¬μ¬μ©ν μ μμ΅λλ€.
WebAssemblyμ λ¨μ :
- 볡μ‘μ±: C/C++ λ° WebAssemblyμ λν μ§μμ΄ νμν©λλ€.
- λλ²κΉ : WebAssembly μ½λ λλ²κΉ μ JavaScript λλ²κΉ λ³΄λ€ λ μ΄λ €μΈ μ μμ΅λλ€.
Web Workers μ¬μ©
Web Workersλ₯Ό μ¬μ©νλ©΄ μ κ³΅κ° λ³νκ³Ό κ°μ κ³μ° μ§μ½μ μΈ μμ μ λ°±κ·ΈλΌμ΄λ μ€λ λλ‘ μ€νλ‘λν μ μμ΅λλ€. μ΄λ κ² νλ©΄ κΈ°λ³Έ μ€λ λκ° μ°¨λ¨λμ§ μμ μ¬μ©μ νκ²½μ΄ λ μνν΄μ§λλ€. μν¬νλ‘λ WebAssemblyλ₯Ό μ¬μ©νλ κ²κ³Ό μ μ¬νμ§λ§ κ³μ°μ Web Workerμμ μνλ©λλ€.
- Web Worker λ§λ€κΈ°: κΈ°λ³Έ μ€ν¬λ¦½νΈμμ μ Web Workerλ₯Ό λ§λ€κ³ μ κ³΅κ° λ³νμ μνν λ³λμ JavaScript νμΌμ λ‘λν©λλ€.
- VideoFrame λ°μ΄ν° κ²μ:
postMessage()λ₯Ό μ¬μ©νμ¬VideoFrameμ μμ ν½μ λ°μ΄ν°λ₯Ό Web Workerλ‘ λ³΄λ λλ€. λλImageBitmapκ³Ό κ°μ μ μ‘ κ°λ₯ν κ°μ²΄λ₯Ό μ¬μ©νμ¬ λΉλμ€ νλ μμ μ μ‘ν μ μμΌλ©°, μ΄λ λ ν¨μ¨μ μΌ μ μμ΅λλ€. - Worker λ΄μμ μ κ³΅κ° λ³ν μν: Web Workerλ λ°μ΄ν°λ₯Ό μμ νκ³ Canvas API(μμ μμ μ μ¬), WebAssembly λλ κΈ°ν λ°©λ²μ μ¬μ©νμ¬ μ κ³΅κ° λ³νμ μνν©λλ€.
- κ²°κ³Ό κ²μ: Web Workerλ
postMessage()λ₯Ό μ¬μ©νμ¬ λ³νλ ν½μ λ°μ΄ν°λ₯Ό κΈ°λ³Έ μ€λ λλ‘ λ€μ 보λ λλ€. - κ²°κ³Ό μ²λ¦¬: κΈ°λ³Έ μ€λ λλ λ³νλ λ°μ΄ν°λ₯Ό μμ νκ³ μ
VideoFrameκ°μ²΄λ₯Ό λ§λ€κ±°λ μ²λ¦¬λ λ°μ΄ν°μ λν μνλ μΆλ ₯μ΄ λ¬΄μμ΄λ μνν©λλ€.
Web Workersμ μ΄μ :
- ν₯μλ μ±λ₯: κΈ°λ³Έ μ€λ λλ μλ΅μ±μ μ μ§ν©λλ€.
- λμμ±: μ¬λ¬ λΉλμ€ μ²λ¦¬ μμ μ λμμ μνν μ μμ΅λλ€.
Web Workersμ κ³Όμ :
- ν΅μ μ€λ²ν€λ: μ€λ λ κ°μ λ°μ΄ν°λ₯Ό 보λ΄μΌ νλ―λ‘ μ€λ²ν€λκ° μΆκ°λ μ μμ΅λλ€.
- 볡μ‘μ±: μ ν리μΌμ΄μ ꡬ쑰μ μΆκ°μ μΈ λ³΅μ‘μ±μ λμ ν©λλ€.
μ κ³΅κ° λ³ν λ° νλ μ νμ λ³νμ μ€μ μ μ©
μ 곡κ°κ³Ό νλ μ νμμ λ³ννλ κΈ°λ₯μ λ€μκ³Ό κ°μ κ΄λ²μν μΉ κΈ°λ° λΉλμ€ μ ν리μΌμ΄μ μ νμμ μ λλ€.
- λΉλμ€ νΈμ§ λ° μ²λ¦¬: μ¬μ©μκ° λΈλΌμ°μ μμ μ§μ μμ 보μ , κ·Έλ μ΄λ© λ° κΈ°ν μκ° ν¨κ³Όλ₯Ό μνν μ μμ΅λλ€. μλ₯Ό λ€μ΄ νΈμ§μλ ν¬λ‘λ§ κΈ°λ° νν°λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬νκΈ° μν΄ μμ€ λΉλμ€λ₯Ό YUV νμμΌλ‘ λ³νν΄μΌ ν μ μμ΅λλ€.
- λΉλμ€ νμ λ° μ€νΈλ¦¬λ°: λ€μν μ₯μΉ λ° νλ«νΌ κ°μ νΈνμ±μ 보μ₯ν©λλ€. λΉλμ€ μ€νΈλ¦Όμ ν¨μ¨μ μΈ μΈμ½λ© λ° μ μ‘μ μν΄ κ³΅ν΅ μ 곡κ°(μ: YUV)μΌλ‘ λ³νν΄μΌ νλ κ²½μ°κ° λ§μ΅λλ€. λν λΉλμ€ νμ μ ν리μΌμ΄μ μ μ²λ¦¬νκΈ° μν΄ λ€μν μΉ΄λ©λΌμ νμμμ λ€μ΄μ€λ λΉλμ€λ₯Ό μΌκ΄λ νμμΌλ‘ λ³νν΄μΌ ν μ μμ΅λλ€.
- λΉλμ€ μ¬μ: λ€μν λμ€νλ μ΄ μ₯μΉμμ λΉλμ€ μ½ν μΈ λ₯Ό μ¬μν μ μμ΅λλ€. μλ₯Ό λ€μ΄ HDRμ μ§μνμ§ μλ λμ€νλ μ΄μ κ²½μ° HDR μ½ν μΈ λ₯Ό SDRλ‘ λ³νν©λλ€.
- μ½ν μΈ μ μ νλ«νΌ: μ¬μ©μκ° λ€μν νμμΌλ‘ λΉλμ€λ₯Ό κ°μ Έμ¨ λ€μ μ¨λΌμΈ 곡μ λ₯Ό μν΄ μΉ μΉνμ μΈ νμμΌλ‘ λ³νν μ μμ΅λλ€.
- μ¦κ° νμ€ (AR) λ° κ°μ νμ€ (VR) μ ν리μΌμ΄μ : AR/VR μ±μ μνν μ¬μ©μ νκ²½μ 보μ₯νκΈ° μν΄ μ νν μμ μΌμΉ λ° νλ μ νμμ΄ νμν©λλ€.
- λΌμ΄λΈ λΉλμ€ λ°©μ‘: λ€μν κΈ°λ₯μ΄ μλ λ€μν μμ²μ μ₯μΉμ λΉλμ€ μ€νΈλ¦Όμ μ‘°μ ν©λλ€. μλ₯Ό λ€μ΄ λ°©μ‘μ¬λ κ³ ν΄μλ λ°©μ‘μ λͺ¨λ°μΌ μ¬μ©μλ₯Ό μν λ€μν μ ν΄μλ νμμΌλ‘ λ³νν μ μμ΅λλ€.
μ±λ₯ μ΅μ ν
μ κ³΅κ° λ³νμ κ³μ° μ§μ½μ μΈ νλ‘μΈμ€μΌ μ μμ΅λλ€. μ±λ₯μ μ΅μ ννλ €λ©΄ λ€μ μ λ΅μ κ³ λ €νμμμ€.
- μ¬λ°λ₯Έ κΈ°μ μ ν: μ ν리μΌμ΄μ μ νΉμ μꡬ μ¬νκ³Ό λ³νμ 볡μ‘μ±μ λ°λΌ κ°μ₯ μ μ ν λ°©λ²(Canvas API, WebAssembly, Web Workers)μ μ νν©λλ€. μ€μκ° μ ν리μΌμ΄μ μ κ²½μ° WebAssembly λλ Web Workersκ° μ νΈλλ κ²½μ°κ° λ§μ΅λλ€.
- λ³ν μ½λ μ΅μ ν: νΉν ν΅μ¬ λ³ν κ³μ°μ μν΄ λ§€μ° ν¨μ¨μ μΈ μ½λλ₯Ό μμ±ν©λλ€. μ€λ³΅ μμ μ μ΅μννκ³ μ΅μ νλ μκ³ λ¦¬μ¦μ νμ©ν©λλ€.
- λ³λ ¬ μ²λ¦¬ μ¬μ©: Web Workersλ₯Ό νμ©νμ¬ λ³ν νλ‘μΈμ€λ₯Ό λ³λ ¬ννμ¬ μν¬λ‘λλ₯Ό μ¬λ¬ μ€λ λμ λΆμ°ν©λλ€.
- λ°μ΄ν° μ μ‘ μ΅μν: κΈ°λ³Έ μ€λ λμ Web Workers λλ WebAssembly λͺ¨λ κ°μ λΆνμν λ°μ΄ν° μ μ‘μ νΌνμμμ€. μ μ‘ κ°λ₯ν κ°μ²΄ (μ:
ImageBitmap)λ₯Ό μ¬μ©νμ¬ μ€λ²ν€λλ₯Ό μ€μ λλ€. - κ²°κ³Ό μΊμ: κ°λ₯ν κ²½μ° μ κ³΅κ° λ³ν κ²°κ³Όλ₯Ό μΊμνμ¬ λΆνμνκ² λ€μ κ³μ°νμ§ μλλ‘ ν©λλ€.
- μ½λ νλ‘ν: λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ½λ νλ‘νμ μμ±νκ³ μ±λ₯ λ³λͺ© νμμ μλ³ν©λλ€. μ ν리μΌμ΄μ μμ κ°μ₯ λλ¦° λΆλΆμ μ΅μ νν©λλ€.
- νλ μ μλ κ³ λ €: κ°λ₯νλ©΄ νλ μ μλλ₯Ό μ€μ λλ€. μ¬μ©μκ° 60FPS λμ 30FPSμμ λ³νμ΄ λ°μνλμ§ μΈμνμ§ λͺ»νλ κ²½μ°κ° λ§μ΅λλ€.
μ€λ₯ μ²λ¦¬ λ° λλ²κΉ
WebCodecs λ° μ κ³΅κ° λ³νμ μ¬μ©ν λλ κ°λ ₯ν μ€λ₯ μ²λ¦¬ λ° λλ²κΉ κΈ°μ μ ν΅ν©νλ κ²μ΄ μ€μν©λλ€.
- λΈλΌμ°μ νΈνμ± νμΈ: WebCodecs API λ° μ¬μ© μ€μΈ κΈ°μ (μ: WebAssembly)μ΄ λμ λΈλΌμ°μ μμ μ§μλλμ§ νμΈν©λλ€. κΈ°λ₯μ΄ μ§μλμ§ μλ μν©μ μ μμ μΌλ‘ μ²λ¦¬νλ €λ©΄ κΈ°λ₯ κ°μ§λ₯Ό μ¬μ©ν©λλ€.
- μμΈ μ²λ¦¬: μ κ³΅κ° λ³ν λλ νλ μ νμ λ³ν μ€μ λ°μν μ μλ μμΈλ₯Ό catchνλ €λ©΄ μ½λλ₯Ό `try...catch` λΈλ‘μΌλ‘ λνν©λλ€.
- λ‘κΉ μ¬μ©: μ½λ μ€νμ μΆμ νκ³ μ μ¬μ μΈ λ¬Έμ λ₯Ό μλ³νκΈ° μν΄ ν¬κ΄μ μΈ λ‘κΉ μ ꡬνν©λλ€. μ€λ₯, κ²½κ³ λ° κ΄λ ¨ μ 보λ₯Ό κΈ°λ‘ν©λλ€.
- ν½μ λ°μ΄ν° κ²μ¬: λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ³ν μ νμ ν½μ λ°μ΄ν°λ₯Ό κ²μ¬νμ¬ μ κ³΅κ° λ³νμ΄ μ¬λ°λ₯΄κ² μλνλμ§ νμΈν©λλ€.
- λ€μν μ₯μΉ λ° λΈλΌμ°μ μμ ν μ€νΈ: λ€μν μ₯μΉ λ° λΈλΌμ°μ μμ μ ν리μΌμ΄μ μ ν μ€νΈνμ¬ νΈνμ±μ νμΈνκ³ μ κ³΅κ° λ³νμ΄ μ¬λ°λ₯΄κ² μ μ©λλμ§ νμΈν©λλ€.
- μ κ³΅κ° νμΈ: λΉλμ€ νλ μμ μμ€ λ° λμ μ 곡κ°μ μ¬λ°λ₯΄κ² μλ³νλμ§ νμΈν©λλ€. μλͺ»λ μ κ³΅κ° μ 보λ λΆμ νν λ³νμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- νλ μ μμ λͺ¨λν°λ§: μ±λ₯μ΄ λ¬Έμ μΈ κ²½μ° λ³ν μ€ νλ μ μμ λ₯Ό λͺ¨λν°λ§ν©λλ€. μμ λ νλ μμ μ΅μννκΈ° μν΄ μ²λ¦¬ κΈ°μ μ μ‘°μ ν©λλ€.
λ―Έλ λ°©ν₯ λ° μλ‘μ΄ κΈ°μ
WebCodecs API λ° κ΄λ ¨ κΈ°μ μ λμμμ΄ μ§ννκ³ μμ΅λλ€. ν₯ν κ°λ°μ μ£Όμν΄μΌ ν λͺ κ°μ§ μμμ λ€μκ³Ό κ°μ΅λλ€.
- μ§μ μ κ³΅κ° λ³ν κΈ°λ₯: νμ¬ WebCodecs APIμλ κΈ°λ³Έ μ 곡 μ κ³΅κ° λ³ν κΈ°λ₯μ΄ μμ§λ§ ν₯ν API μΆκ°λ₯Ό ν΅ν΄ μ΄ νλ‘μΈμ€λ₯Ό λ¨μνν μ μμ΅λλ€.
- HDR μ§μ κ°μ : HDR λμ€νλ μ΄κ° λμ± λ³΄νΈνλ¨μ λ°λΌ λ€μν HDR νμμ λν λ³΄λ€ ν¬κ΄μ μΈ μ§μμ ν¬ν¨νμ¬ WebCodecs λ΄μμ HDR μ½ν μΈ μ²λ¦¬ κΈ°λ₯μ΄ ν₯μλ κ²μΌλ‘ μμλ©λλ€.
- GPU κ°μ: λ λΉ λ₯Έ μ κ³΅κ° λ³νμ μν΄ GPUλ₯Ό νμ©ν©λλ€.
- WebAssemblyμμ ν΅ν©: WebAssembly λ° κ΄λ ¨ λꡬμ μ§μμ μΈ λ°μ μ λΉλμ€ μ²λ¦¬ μ±λ₯μ κ³μ μ΅μ νν κ²μ λλ€.
- λ¨Έμ λ¬λκ³Όμ ν΅ν©: λΉλμ€ νμ§ ν₯μ, μμΆ κ°μ λ° λ λμ λΉλμ€ νκ²½μ λ§λ€κΈ° μν λ¨Έμ λ¬λ λͺ¨λΈμ νꡬν©λλ€.
κ²°λ‘
WebCodecsλ μΉ κΈ°λ° λΉλμ€ μ²λ¦¬λ₯Ό μν κ°λ ₯ν κΈ°λ°μ μ 곡νλ©° μ κ³΅κ° λ³νμ μ€μν μμμ λλ€. API μ체λ μ§μ λ³ν κΈ°λ₯μ μ 곡νμ§ μμ§λ§ Canvas, WebAssembly λ° Web Workersμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ³νν μ μμ΅λλ€. μ 곡κ°κ³Ό νλ μ νμμ κ°λ μ μ΄ν΄νκ³ , μ¬λ°λ₯Έ κΈ°μ μ μ ννκ³ , μ±λ₯μ μ΅μ νν¨μΌλ‘μ¨ κ°λ°μλ κ³ νμ§ λΉλμ€ νκ²½μ μ 곡νλ μ κ΅ν λΉλμ€ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€. μΉ λΉλμ€ νκ²½μ΄ κ³μ μ§νν¨μ λ°λΌ μ΄λ¬ν κΈ°λ₯μ λν μ 보λ₯Ό μ μ§νκ³ μλ‘μ΄ κΈ°μ μ μμ©νλ κ²μ΄ νμ μ μ΄κ³ λ§€λ ₯μ μΈ μΉ μ ν리μΌμ΄μ μ λ§λλ λ° νμμ μ λλ€.
μ΄λ¬ν κΈ°μ μ ꡬννκ³ μ±λ₯μ μ΅μ νν¨μΌλ‘μ¨ κ°λ°μλ λΈλΌμ°μ μμ λΉλμ€ μ²λ¦¬λ₯Ό μν κ΄λ²μν κ°λ₯μ±μ μ΄μ΄ μ μΈκ³ μ¬μ©μλ₯Ό μν λμ± μλμ μ΄κ³ λͺ°μ κ° μλ μΉ κ²½νμ μ°½μΆν μ μμ΅λλ€.